/*
 * 编译命令 g++ .\getFileNames\getFileNames.cpp -I. -DDEBUG -fexec-charset=GBK
 * 运行命令 .\getFileNames\getFileNames D:\work\XTSvkgl\acts\reports
 */
#include <string>
#include <vector>
#include <iostream>
#include <io.h>
#include "log/log.h"

/*
 * path     输入路径
 * files    返回path路径下的所有文件路径
 */
void getFileNames(std::string path, std::vector<std::string>& files)
{
    //文件句柄
    //注意：我发现有些文章代码此处是long类型，实测运行中会报错访问异常
    intptr_t hFile = 0;
    //文件信息
    struct _finddata_t fileinfo;
    std::string p;
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    {
        do
        {
            //如果是目录,递归查找
            //如果不是,把文件绝对路径存入vector中
            // _A_ARCH（存档）
            // _A_HIDDEN（隐藏）
            // _A_NORMAL（正常）
            // _A_RDONLY（只读）
            // _A_SUBDIR（文件夹）
            // _A_SYSTEM（系统）
            if ((fileinfo.attrib & _A_SUBDIR))
            {
                if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    getFileNames(p.assign(path).append("\\").append(fileinfo.name), files);
            }
            else
            {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}

int main (int argc, const char** argv)
{
    LOG("printf argc and argv");
    for(int i = 0; i < argc; i++) {
        LOG("%d,%s",i,argv[i]);
    }

    std::vector<std::string> fileNames;
    std::string path(argv[1]); // "D:\work\XTSvkgl\acts\reports"
    getFileNames(path, fileNames);

    for (const auto &ph : fileNames) {
        LOG("%s",ph.c_str());
    }

    return 0;
}